/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.dp1.pucp.Ventas.DAO;

import com.dp1.pucp.Modelo.Clases.Departamento;
import com.dp1.pucp.Modelo.Clases.Distrito;
import com.dp1.pucp.Modelo.Clases.Provincia;
import com.dp1.pucp.Modelo.Clases.Tipocliente;
import com.dp1.pucp.Modelo.Clases.Cliente;
import com.dp1.pucp.Util.HibernateUtil;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.swing.JOptionPane;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

/**
 *
 * @author pachon
 */
public class ClienteDAO {

    public void guardarCliente(Cliente cliente){
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx =  session.beginTransaction();
        try {
            session.saveOrUpdate(cliente);
            tx.commit();
        }catch(HibernateException e) {
            throw new HibernateException(e);
        } finally {
            session.close();            
        }        
    }
    
    public ArrayList<Tipocliente> listarTipoCliente() {
        ArrayList<Tipocliente> tipos = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            List lista = session.createQuery("from Tipocliente order by Idtipocliente").list();
            Iterator iter = lista.iterator();
            while (iter.hasNext()) {
                Tipocliente tp = (Tipocliente) iter.next();
                Hibernate.initialize(tp.getIdtipocliente());
                Hibernate.initialize(tp.getNombre());
                Hibernate.initialize(tp.getDescripcion());
                tipos.add(tp);
            }
            tx.commit();
        } catch (HibernateException e) {
            throw new HibernateException(e);
           
        } finally {
            session.close();
            return tipos;
        }
    }

    public ArrayList<Distrito> listarDistrito(Provincia p) {
        ArrayList<Distrito> distritos = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            List lista = session.createQuery("from Distrito where idprovincia= " + p.getIdprovincia() + " order by iddistrito").list();
            Iterator iter = lista.iterator();
            while (iter.hasNext()) {
                Distrito d = (Distrito) iter.next();
                Hibernate.initialize(d.getIddistrito());
                Hibernate.initialize(d.getProvincia());
                distritos.add(d);
            }
            tx.commit();
        } catch (HibernateException e) {
            throw new HibernateException(e);
        } finally {
            session.close();
            return distritos;
        }
    }

    public ArrayList<Provincia> listarProvincia(Departamento d) {
        ArrayList<Provincia> provincias = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            List lista = session.createQuery("from Provincia where iddepartamento = " + d.getIddepartamento() + " order by idprovincia").list();
            Iterator iter = lista.iterator();
            while (iter.hasNext()) {
                Provincia p = (Provincia) iter.next();

                Hibernate.initialize(p.getIdprovincia());
                Hibernate.initialize(p.getDepartamento());
                provincias.add(p);
            }
            tx.commit();
        } catch (HibernateException e) {
            throw new HibernateException(e);
        } finally {
            session.close();
            return provincias;
        }
    }

    public ArrayList<Departamento> listarDepartamento() {
        ArrayList<Departamento> departamentos = new ArrayList<>();
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try {
            List lista = session.createQuery("from Departamento order by iddepartamento").list();
            Iterator iter = lista.iterator();
            while (iter.hasNext()) {
                Departamento d = (Departamento) iter.next();

                Hibernate.initialize(d.getIddepartamento());

                departamentos.add(d);
            }
            tx.commit();
        } catch (HibernateException e) {
            throw new HibernateException(e);
        } finally {
            session.close();
            return departamentos;
        }
    }
    
    public ArrayList<String> listarEstado() 
    {
        ArrayList<String> estados = new ArrayList<>();
        estados.add("--Seleccione--");
        estados.add("Inactivo");
        estados.add("Activo");
        return estados;
    }
    
    public ArrayList<Cliente> listarCliente(int estadoCliente){
    ArrayList<Cliente> listaResultados = new ArrayList<>();       
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        try{
            List lista = session.createQuery("from Cliente where estado = "+ estadoCliente +" order by idcliente").list();        
            Iterator iter = lista.iterator();
            while (iter.hasNext()) { 
                Cliente c = (Cliente) iter.next();
                Hibernate.initialize(c.getRazonsocial());
                Hibernate.initialize(c.getRuc());
                Hibernate.initialize(c.getPaginaweb());
                Hibernate.initialize(c.getTelefono());
                Hibernate.initialize(c.getDireccionfiscal());
                Hibernate.initialize(c.getEstado());
                Hibernate.initialize(c.getTipocliente());
                Hibernate.initialize(c.getTipocliente().getIdtipocliente());
                Hibernate.initialize(c.getTipocliente().getNombre());
                Hibernate.initialize(c.getTipocliente().getDescripcion());
                Hibernate.initialize(c.getDistrito());
                Hibernate.initialize(c.getDistrito().getIddistrito());
                Hibernate.initialize(c.getDistrito().getProvincia());
                Hibernate.initialize(c.getDistrito().getProvincia().getIdprovincia());
                Hibernate.initialize(c.getDistrito().getProvincia().getDepartamento());
                Hibernate.initialize(c.getDistrito().getProvincia().getDepartamento().getIddepartamento());
                
                
                listaResultados.add(c);
            }        
            tx.commit();
        } catch(HibernateException e) {
            throw new HibernateException(e);    
        } finally {
            session.close();
            return listaResultados;
        }         
    }    
    
    
    
    public ArrayList<Cliente> listarCliente(int estadoCliente, int codigo, String nombre){
    ArrayList<Cliente> listaResultados = new ArrayList<>();       
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();
        List lista;
        try{
            
        if (estadoCliente==0){ //busca todos los estados    
            if (codigo==0){//busca todos los codigos
                lista = session.createQuery("from Cliente where razonsocial like '%"+nombre+"%' order by idcliente").list();   
            }
            else {//segun codigo
              
                lista = session.createQuery("from Cliente where idcliente = "+codigo+
                    " and razonsocial like '%"+nombre+"%' order by idcliente").list();        
            
            }
        }else{// segun estado
            
            estadoCliente= estadoCliente-1;
             if (codigo==0){//busca todos los codigos
                lista = session.createQuery("from Cliente where estado = "+ estadoCliente +
                        " and razonsocial like '%"+nombre+"%' order by idcliente").list();   
            } 
            else {//segun codigo
               
                lista = session.createQuery("from Cliente where estado = "+ estadoCliente +
                    " and idcliente = "+codigo+
                    " and razonsocial like '%"+nombre+"%' order by idcliente").list();        
            
            }
        }
            
            Iterator iter = lista.iterator();
            while (iter.hasNext()) { 
                Cliente c = (Cliente) iter.next();
                Hibernate.initialize(c.getRazonsocial());
                Hibernate.initialize(c.getRuc());
                Hibernate.initialize(c.getPaginaweb());
                Hibernate.initialize(c.getTelefono());
                Hibernate.initialize(c.getDireccionfiscal());
                Hibernate.initialize(c.getEstado());
                Hibernate.initialize(c.getTipocliente());
                Hibernate.initialize(c.getTipocliente().getIdtipocliente());
                Hibernate.initialize(c.getTipocliente().getNombre());
                Hibernate.initialize(c.getTipocliente().getDescripcion());
                Hibernate.initialize(c.getDistrito());
                Hibernate.initialize(c.getDistrito().getIddistrito());
                Hibernate.initialize(c.getDistrito().getProvincia());
                Hibernate.initialize(c.getDistrito().getProvincia().getIdprovincia());
                Hibernate.initialize(c.getDistrito().getProvincia().getDepartamento());
                Hibernate.initialize(c.getDistrito().getProvincia().getDepartamento().getIddepartamento());
                
                
                listaResultados.add(c);
            }        
            tx.commit();
        } catch(HibernateException e) {
            throw new HibernateException(e);    
        } finally {
            session.close();
            return listaResultados;
        }         
    }    
    
}
